package com.practice.designMode.observer;


/**
 * 观察者模式：事件生产者 -> 事件消费者（监听器）
 * 发布订阅： 事件生产者 -> 事件总线 -> 事件消费者（监听器）
 * 一般而言，发布订阅模式是观察者模式的升级版本，更加优秀，对事件生产者与监听器之间做了解耦
 */
public class ObserverMain {
    public static void main(String[] args) {
        /**
         * 这里采用观察者模式，事件生产者与监听器之间存在耦合，有明显的局限性
         * 当监听器想要监听多种事件时，就需要在监听器中添加多个方法，这样就会导致监听器的方法过多，难以维护
         * 而事件生产者本身没有遵循单一原则，同时生产事件和告知监听器
         */
//        WeatherStation weatherStation = new WeatherStation();
//        User user1 = new User("user1", info ->{
//            if(info.equals("Sunday")){
//                System.out.println(info + "user1 get out");
//            }else {
//                System.out.println(info + "user1 stay home");
//            }
//        });
//
//        User user2 = new User("user2", info ->{
//            if(info.equals("Rainy")){
//                System.out.println(info + "user2 get out");
//            }else {
//                System.out.println(info + "user2 stay home");
//            }
//        });
//
//        weatherStation.subsribe(user1);
//        weatherStation.subsribe(user2);
//        weatherStation.start();

        /**
         * 这里采用发布订阅模式，事件生产者与监听器之间不存在耦合，监听器只需要关注自己感兴趣的事件
         * 事件生产者只需要关注事件的发布，监听器只需要关注事件的订阅
         */
        TVStation tvStation = new TVStation();
        WeatherStation weatherStation = new WeatherStation(tvStation);
        User user1 = new User("user1", info ->{
            if(info.equals("Sunday")){
                System.out.println(info + "user1 get out");
            }else {
                System.out.println(info + "user1 stay home");
            }
        });

        User user2 = new User("user2", info ->{
            if(info.equals("Rainy")){
                System.out.println(info + "user2 get out");
            }else {
                System.out.println(info + "user2 stay home");
            }
        });

        tvStation.subsribe(user1,WeatherUpdateEvent.class);
        tvStation.subsribe(user2,WeatherUpdateEvent.class);
        weatherStation.start();
    }
}
